package prirprojekt;

import java.awt.Frame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class Tabela extends JTable {

    Tabela(int r, int c) {
        super(new DefaultTableModel(r, c));
    }

    //ustawia etykiety kolumn
    public void setLabels(String s) {
        for (int i = 0; i < this.getColumnModel().getColumnCount(); i++) {
            this.getColumnModel().getColumn(i).setHeaderValue(s + i);
        }
    }

    //zwraca liczbę kolumn
    public int getNumerOfColums() {
        return this.getColumnModel().getColumnCount();
    }

    //ustawia liczbę kolumn
    public void setColumns(int ileZadan) {
        DefaultTableModel model = (DefaultTableModel) this.getModel();
        int colsNum = this.getColumnCount();
        if (ileZadan < colsNum) {
            for (int i = ileZadan; i < colsNum; i++) {
                this.removeColumn(this.getColumnModel().getColumn(ileZadan));
            }
            model.setColumnCount(ileZadan);
        } else if (ileZadan > colsNum) {
            for (int i = colsNum; i < ileZadan; i++) {
                model.addColumn(null);
            }
        }
//        this.setModel(model);
    }

    //ustawia liczbę wierszy
    public void setRows(int nbrCPU) {
        Integer[] tmp = {};
        DefaultTableModel model = (DefaultTableModel) this.getModel();
        int rowsNum = model.getRowCount();
        if (nbrCPU > rowsNum) {
            for (int i = rowsNum; i < nbrCPU; i++) {
                model.addRow(tmp);
            }
        } else if (nbrCPU < rowsNum) {
            for (int i = nbrCPU; i < rowsNum; i++) {
                model.removeRow(nbrCPU);
            }
        }
        this.setModel(model);
    }

    //wypełnia tablicę zadaniami i ich czasami na poszczególnych CPU
    public void populateTasks(PermutacjaZadan pz) {
        int nRows = this.getRowCount();
        int nCols = this.getColumnCount();

        for (int i = 0; i < nRows; i++) {
            for (int j = 0; j < nCols; j++) {
                this.setValueAt(pz.tablicaZadan[j].czasyNaCPU[i], i, j);
            }

        }
    }

    //wypełnia tablicę wynikami
    public void populateAnswers(Roj r) {
        DefaultTableModel model = (DefaultTableModel) this.getModel();

        int nRows = this.getRowCount();
        int nCols = this.getColumnCount();

        for (int i = 0; i < nRows; i++) {
            for (int j = 0; j < nCols; j++) {
                this.setValueAt("z" + r.permutacjeZadan[i].tablicaZadan[j].id, i, j);
            }

        }
        model.addColumn(null);
        this.setLabels("Nr ");
        //dodaj kolumnę z jakością obliczeń
        this.getColumnModel().getColumn(nCols).setHeaderValue("Jakość");
        for (int i = 0; i < nRows; i++) {
            this.setValueAt(r.permutacjeZadan[i].jakosc(), i, nCols);
        }
    }

    //dobierz rozmiar tabeli, nadaj etykiety i wypełnij zadaniami wejściowymi
    public void setTasks(int ileZadan, int ileCPU, PermutacjaZadan pz) {
        setColumns(ileZadan);
        setRows(ileCPU);
        setLabels("z");
        populateTasks(pz);
    }

    //wczytaj dane z tabeli wejściowej do programu
    public Zadanie[] loadTasks(int ileZadan, int ileCPU) {
        int[][] czasyNaCPU = new int[ileZadan][ileCPU];
        String[][] czasyNaCPUS = new String[ileZadan][ileCPU];
        Zadanie[] z = new Zadanie[ileZadan];

        for (int i = 0; i < ileZadan; i++) {
            for (int j = 0; j < ileCPU; j++) {
                if (this.getValueAt(j, i) != null) {
                    try {
                        czasyNaCPUS[i][j] = (String) this.getValueAt(j, i);
                    } catch (Exception e) {
                        czasyNaCPUS[i][j] = this.getValueAt(j, i).toString();
                    }
                } else {
                    czasyNaCPUS[i][j] = "1";
                    czasyNaCPU[i][j] = 1;
                }
                try {
                    czasyNaCPU[i][j] = Integer.parseInt(czasyNaCPUS[i][j]);
                    if(czasyNaCPU[i][j] < 1) czasyNaCPU[i][j] = 1;
                    if(czasyNaCPU[i][j] > 20) czasyNaCPU[i][j] = 20;
                } catch (Exception e) {
                    czasyNaCPU[i][j] = 1;
                    JOptionPane.showMessageDialog(new Frame(),
                            "Należy podać czas liczbowo",
                            "Błąd wprowadzenia danych",
                            JOptionPane.ERROR_MESSAGE);
//                        e.toString();
                }
            }
            z[i] = new Zadanie(i, czasyNaCPU[i]);
        }
        return z;
    }
}
